#include "ReceptorChat.h"
#include "Usuario.h"
#include <iostream>
using std::cerr;
using std::endl;
ReceptorChat::ReceptorChat(Usuario* usuario, Socket* socket_usuario) {
  this->usuario = usuario;
  this->socket_usuario = socket_usuario;
  this->recepcion_terminada = false;
}
void ReceptorChat::terminar_recepcion() {
  this->recepcion_terminada = true;
}
ReceptorChat::~ReceptorChat() {
}
void ReceptorChat::run() {
  // Buffer para recibir codigo y bloque de datos
  char buffer[TAM_BLOQUE_INI];
  // Caracter y entero para guardar el codigo de operacion y tamanio
  // del bloque de datos
  char cod_op = 0;
  int tamanio_bloque_datos = 0;
  // Puntero para guardar el bloque de datos
  char* bloque_datos = NULL;
  while (!this->recepcion_terminada) {
    // Recibe codigo y tamanio de bloque de datos
    if (!this->socket_usuario->recibir(buffer, TAM_BLOQUE_INI)) {
      cerr << "No se pudo recibir el codigo y el tamanio" << endl;
      break;
    }
    // Obtiene el codigo y tamanio del bloque
    cod_op = buffer[0];
    tamanio_bloque_datos = *(unsigned int*) &buffer[1];
    // Reserva memoria para el bloque de datos
    bloque_datos = new char[tamanio_bloque_datos];
    // Recibe el bloque de datos
    if(!this->socket_usuario->recibir(bloque_datos, tamanio_bloque_datos)) {
      std::cout << "No se pudo recibir " << std::endl;
      delete[]bloque_datos;
      break;
    }
    switch (cod_op) {
    case 'F': {   // Se recibio un mensaje para el chat
      // Envia el mensaje a la interfaz grafica
      std::string texto_string(bloque_datos);
      this->usuario->enviar_texto_chat_al_chat(texto_string);
    }
      break;
    default:
      // Si se recibio otro codigo se termina la recepcion
      this->recepcion_terminada = true;
      break;
    }
    // Libera la cadena reservada
    delete[]bloque_datos;
  }
}
